﻿using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace UnitTestProject
{
    /// <summary>
    /// 思路：
    /// 1、面向对象的思想
    /// 2、
    /// </summary>
    [TestClass]
    public class B01Test2
    {

        /// <summary>
        /// 1.看题目，测试先行 --策划大于行动。
        /// 2.通过写测试，可以帮助整理思路，包括：
        ///   1）、找到有哪些输入
        ///   2）、找到有哪些条件
        ///   3）、找出有哪些输出
        /// 3、如果有多个输入，则通过对函数写不同的测试，可以提高函数的正确性，
        ///    以及提高排错效率 (做题难在排错）
        /// 说明：
        /// 1）、对于简单的题目，可以不用写测试。
        /// 2）、竞赛题目（或工作任务）都是比较难的，所以掌握测试思维方式，真的是磨刀不费砍柴功
        /// </summary>
        [TestMethod]
        public void TestMethod1()
        {
            var startDay = "1900-1-1";
            var n = 20;
            var calcDay = 13;
            //在工作中，此处返回数组会更好（字符串不好处理)
            var resultExpect = "36 33 34 33 35 35 34";
            var resultReal = CalcWeekDay(startDay, n, calcDay);
            Assert.IsTrue(resultExpect == resultReal);
        }

        private string CalcWeekDay(string startDayStr, int n, int calcDay)
        {
            //计算开始和结束时间
            DateTime startDay = DateTime.Parse(startDayStr);
            DateTime endDay = startDay.AddYears(n).AddDays(-1);

            //在字典中保存数量，定义并初始化,或定义int数组效率更高(字典更简单)。
            var dict = new Dictionary<int, int>();
            for (int i = 0; i < 7; i++)
            {
                dict[i] = 0;
            }

            var startWeekDay = 0;
            while (startDay <= endDay)
            {
                //根据已知条件，计算当前是周几(而不用系统函数)
                var currWeekDay = startWeekDay++ % 7;

                //不是指定某一天，不参与计算
                if (startDay.Day != calcDay)
                {
                    startDay = startDay.AddDays(1);
                    continue;
                };

                //前面初始化过了，保证字典中每一天都有对应的Key值
                dict[currWeekDay]++;
                //加一天后，继续循环
                startDay = startDay.AddDays(1);
            }

            var result = $"{dict[5]} {dict[6]} {dict[0]} {dict[1]} {dict[2]} {dict[3]} {dict[4]}";
            return result;
        }
    }
}


